package net.siufung.core.model;


import net.siufung.core.model.enums.DeletedEnum;

import java.util.List;

/**
 * 领域资源接口
 * @author 陈建峰
 * @since 2022/2/9 11:10 下午
 */
public interface IRepository<EK, E> {

    /**
     * 根据领域对象根实体获取实体
     * @param ek 领域对象根实体
     * @return E
     */
    E findByEk(EK ek);

    /**
     * 根据条件获取实体
     * @param condition 条件
     * @return E
     */
    E findByCondition(E condition);

    /**
     * 根据领域对象根实体集合获取实体集合
     * @param ekList 领域服务根实体对象集合
     * @return List<E>
     */
    List<E> queryList(List<EK> ekList);

    /**
     * 根据条件获取实体集合
     * @param condition 条件
     * @return List<E>
     */
    List<E> queryListByCondition(E condition);

    /**
     * 通过条件获取领域实体集合数量
     * @param condition 条件
     * @return Long
     */
    Long countByCondition(E condition);

    /**
     * 创建对象
     * @param e 领域对象实体
     * @return EK
     * */
    EK create(E e);

    /**
     * 批量创建对象
     * @param eList 领域对象实体列表
     * @return boolean
     * */
    boolean createBatch(List<E> eList);

    /**
     * 更新对象
     * @param e 领域对象
     * @return boolean
     * */
    boolean updateByEk(E e);

    /**
     * 更新对象
     * @param e 查询领域对象
     * @param s 领域对象设置
     * @return boolean
     * */
    boolean updateByCondition(E e, E s);


    /**
     * 更新对象
     * @param ek 领域对象
     * @param deletedEnum 数据状态
     * @return boolean
     */
    boolean updateStatusByEk(EK ek, DeletedEnum deletedEnum);

    /**
     * 批量更新对象
     * @param eList 领域对象列表
     * @return boolean
     * */
    boolean updateBatchByEkList(List<E> eList);

    /**
     * 通过根实体删除领域实体
     * @param ek 根实体
     * @return boolean
     */
    boolean removeByEk(EK ek);

    /**
     * 通过根条件删除领域实体
     * @param e 实体
     * @return boolean
     */
    boolean removeByCondition(E e);

    /**
     * 物理方式批量删除领域实体对象
     * @param ekList 领域服务根实体对象集合
     * @return boolean
     * */
    boolean removeBatchByEkList(List<EK> ekList);

}
